#!/bin/bash

# Linux版本

#  引入区
## Shell 文件包含的语法格式如下：
##  . filename   # 注意点号(.)和文件名中间有一空格
## 或
## source filename
## 注：被包含的文件 filename1.sh  filename2.sh 不需要可执行权限。

# 读取版本记录日志文件，获取最后版本号（注日志格式是最后一行内容只有版本号 如： 1.0）
function readVersionLogFileGetVersionNumber()
{
    # 第一个参数为 $1 读取文件路径
    local __filePath=$1
    #获取文件最后1行
    local __CMDStr="tail -n 1 "${__filePath}
    #`${CMDStr}`
    local __versionNumberStr=`${__CMDStr}`
    local __returnData=$(splittingStringsUpdateVersion ${__versionNumberStr})
    echo ${__returnData}
    #返回内容
}


# 使用内置的分割符IFS 拆分字符串 +1 成新的版本号
function splittingStringsUpdateVersion()
{
    # echo “splittingStringsUpdateVersion“
    local ____str="1.0"
    # 第一个参数为 $1 字符串
    local __str=$1
    #echo "$__str"
    local __OLD_IFS="$IFS" #保存旧的分隔符
    IFS="."
    local __array=($__str)
    IFS="$__OLD_IFS" # 将IFS恢复成原来的
    local i=0
    for i in "${!__array[@]}";
    do
         # echo "$i=>${__array[i]}"
         # echo "*"
         # echo "${#__array[*]}"
         # echo "nm"
         if [ $i -eq 0 ];then
            # echo "if S"
            local __newStr=${__array[i]}
            # echo $__newStr 
            # echo "if Se"     
         elif [ $(($i+1)) -eq ${#__array[*]} ];then
            # echo "elif"
            local __newNember=`expr ${__array[i]} + 1`
            __newStr=${__newStr}"."${__newNember}
            # echo ${__newStr}
            # echo "elif e"
         else
            # echo "else"
            __newStr=${__newStr}"."${__array[i]}
            # echo ${__newStr}
            # echo "else E"
         fi
    done
    # echo "Over"
    echo ${__newStr}
    # echo "Over End"
}

# 写新的版本号到日志中
function writeNewVersionNumberToLog()
{
    # local ____str="1.0"
    # 第一个输入参数为 $1 版本日志文件路径
    local __versionLogFilePath=$1
    
    # 第二个输入参数为 $2 为最新生成的版本号
    local __versionNumber=$2
    
    ## 获取当前系统时间
    local __nowSystemDatez=`date +"%Y%m%d%H%M%S%z"`
    ## 输出实例20190604163925+0800
    
    ## 将新版版号生成时间记录到版本更新日志中
    echo ${__nowSystemDatez} >> ${__versionLogFilePath}
    ## echo $__nowSystemDatez >> $__versionLogFilePath
    
    ## 将新版版号生成时间记录到版本更新日志中
    echo ${__versionNumber}  >> ${__versionLogFilePath}
    ## echo $__versionNumber  >> $__versionLogFilePath
}

# 判断是否是目录还是文件
function judgeSoftLinkConnection()
{
    local ____str="1.0"
    # 第一个输入参数为 $1 版本文件路径
    local __FilePath=$1
    
    if [ -f __FilePath ];then 
       # 是文件
       #echo "it is file";
       return 1;
    else
       # 是目录/文件夹
       #echo "it is directory";
       return 2;
    fi
}

# 生成新版本的存放目录文件夹
function createNewVesionFolder()
{
    # 第一个输入参数为 $1 文件所在路径
    local __folderCatalogue=$1
    
    # 第2个输入参数为 $2 文件名称
    local __folderName=$2
    
    # 软链接路径拼接
    local __folderPath=${__folderCatalogue}${__folderName}
    
    # 软链接目录/文件夹若存在，则不执行 返回3；否则，创建目录/文件夹
    if [ -d ${__folderPath} ];then
        return 3
    else
        mkdir ${__folderPath}
        #echo ${_folderPath}
        #pwd
        #ls
        return 2
    fi
}

# 生成或修改新的项目目录软连接
function createOrAlterSoftLinkConnection()
{
    # 第一个输入参数为 $1 软链接所在目录
    local __softLinkConnectionCatalogue=$1
    
    # 第二个输入参数为 $2 软链接名称
    local __softLinkConnectionName=$2
    
    # 第三个输入参数为 $3 源文件所在路径
    local __sourceFileCatalogue=$3
    
    # 第四个输入参数为 $4 源文件名称
    local __sourceFileName=$4
    
    # 软链接路径拼接
    local __softLinkConnectionPath=${__softLinkConnectionCatalogue}${__softLinkConnectionName}
    
    local __sourceFilePath=${__sourceFileCatalogue}${__sourceFileName}
    
    # 软链接目录若存在，则删除
    if [ -d ${__softLinkConnectionPath} ];then
        # 删除软链接
        rm -f ${__softLinkConnectionPath}
    fi
    
    # 软链接文件若存在，则删除
    if [ -f ${__softLinkConnectionPath} ];then
        # 删除软链接
        rm -f ${__softLinkConnectionPath}
    fi
    
    # 创建软链接
    ln -s ${__sourceFilePath} ${__softLinkConnectionPath}
}

# 更新版本的主程序
function versionUpdateDeploymentMain()
{
    #切换到工作目录
    cd /opt/docker/images/nginx-io/web/xxx/
    # 打印切换后的路径
    pwd 
    
    ## 项目版本更新日志记录存放地址
    local __versionLogFileCatalogue="/opt/docker/images/nginx-io/web/xxx/"

    ## 版本日志文件名
    local __versionLogFileName="ToolUpdateVersion.log"
    
    # 项目版本实际存放目录
    #local __prjSaveCatalogue="/opt/docker/images/nginx-io/web/xxx/"
    local __prjSaveCatalogue="./"

    # 项目版本实际存放文夹名或文件名
    local __prjSaveFileOrFolderName="run_v"

    # 软连接存放目录
    #local __prjSoftLinkConnectionCatalogue="/opt/docker/images/nginx-io/web/xxx/"
    local __prjSoftLinkConnectionCatalogue="./"
    
    # 软连接名
    local __prjSoftLinkConnectionName="run"
    
    # 获取版本号
    local __initVersionNumber="1.0"
    
    local __versionLogFilePath=${__versionLogFileCatalogue}${__versionLogFileName}

    # 执行函数 读取日志文件获取版本 +1
    local __versionNumberStr=$(readVersionLogFileGetVersionNumber  ${__versionLogFilePath})
    # echo "X" 
    echo ${__versionNumberStr}
    # echo "Y"
    
    # 组成后的新版本号后组成的文件或文件夹名
    local __vewVersionPrjSaveFileOrFolderName=${__prjSaveFileOrFolderName}${__versionNumberStr} 
    
    # 创建新目录
    local __flag=1
    local i=0
    while [ ${__flag} -eq 1 ]; 
    do
        i=`expr $i + 1`
        echo "循环次数:"${i}
        createNewVesionFolder ${__prjSaveCatalogue} ${__vewVersionPrjSaveFileOrFolderName};
        local __flag2=$?;
        # echo ${__flag2}
        if [ ${__flag2} == 3 ]
        then
            # echo '两个数字相等,为3!'
            # 已存在同名文件夹 ，版本再+1
            __versionNumberStr=$(splittingStringsUpdateVersion ${__versionNumberStr})
            # 重新再组合新文件夹名
            __vewVersionPrjSaveFileOrFolderName=${__prjSaveFileOrFolderName}${__versionNumberStr} 
        else
            # echo '两个数字不相等!'
            __flag=0
        fi
        #if
    done
    
    # 建立软链接
    #createOrAlterSoftLinkConnection ${__prjSoftLinkConnectionCatalogue} ${__prjSoftLinkConnectionName} ${__prjSaveCatalogue} ${__vewVersionPrjSaveFileOrFolderName}
    createOrAlterSoftLinkConnection ${__prjSoftLinkConnectionCatalogue} ${__prjSoftLinkConnectionName} ${__prjSaveCatalogue} ${__vewVersionPrjSaveFileOrFolderName}
    
    # 执行 写新的版本号到日志中 函数
    $(writeNewVersionNumberToLog  ${__versionLogFilePath} ${__versionNumberStr})
}



# 执行入口

if true 
then
    # 开始执行 更新版本文件夹版本
    versionUpdateDeploymentMain
else
    ## 函数单元测试
    # judgeSoftLinkConnection "./"
    splittingStringsUpdateVersion   "1.0"
    createNewVesionFolder "./" "testFolder"
    createOrAlterSoftLinkConnection "./" "test" "/" "home"
fi

# 脚本结束
